home *** CD-ROM | disk | FTP | other *** search
/ Meeting Pearls 2 / Meeting Pearls Vol. II (1995)(GTI - Schatztruhe)[!].iso / Pearls / comm / Envoy / Conf / conf.c < prev    next >
C/C++ Source or Header  |  1994-04-16  |  69KB  |  1,630 lines

  1. /*************************************************************************
  2. Conference Client written by Jeffrey A. Litz
  3.  
  4. litz@cs.uwp.edu  -or-  Jeff_Litz@EDTNG.Kenosha.WI.US
  5.  
  6. Copyright ©1994 JL Productions.
  7. *************************************************************************/
  8.  
  9. #include <exec/types.h>
  10. #include <exec/memory.h>
  11. #include <exec/ports.h>
  12. #include <exec/semaphores.h>
  13.  
  14. #include <intuition/intuition.h>
  15. #include <intuition/classes.h>
  16. #include <intuition/classusr.h>
  17. #include <intuition/imageclass.h>
  18. #include <intuition/gadgetclass.h>
  19.  
  20. #include <workbench/workbench.h>
  21. #include <workbench/startup.h>
  22.  
  23. #include <dos/dostags.h>
  24.  
  25. #include <libraries/gadtools.h>
  26.  
  27. #include <graphics/displayinfo.h>
  28. #include <graphics/gfxbase.h>
  29.  
  30. #include <utility/tagitem.h>
  31.  
  32. #include <clib/alib_protos.h>
  33. #include <clib/alib_stdio_protos.h>
  34. #include <clib/dos_protos.h>
  35. #include <clib/nipc_protos.h>
  36. #include <clib/services_protos.h>
  37. #include <clib/exec_protos.h>
  38. #include <clib/intuition_protos.h>
  39. #include <clib/gadtools_protos.h>
  40. #include <clib/graphics_protos.h>
  41. #include <clib/utility_protos.h>
  42. #include <clib/icon_protos.h>
  43.  
  44. #include <devices/timer.h>
  45.  
  46. #include <envoy/nipc.h>
  47. #include <envoy/services.h>
  48.  
  49. #include <pragmas/exec_pragmas.h>
  50. #include <pragmas/nipc_pragmas.h>
  51. #include <pragmas/dos_pragmas.h>
  52. #include <pragmas/services_pragmas.h>
  53. #include <pragmas/graphics_pragmas.h>
  54. #include <pragmas/gadtools_pragmas.h>
  55. #include <pragmas/intuition_pragmas.h>
  56. #include <pragmas/utility_pragmas.h>
  57.  
  58. #include <string.h>
  59.  
  60. #include "conf.h"
  61.  
  62. static UBYTE version[32] = {"$VER: Conference Client v1.12"};
  63.  
  64. extern KPrintF(STRPTR,...);
  65.  
  66. extern long SetupScreen(void);
  67. extern void CloseDownScreen(void);
  68. extern void Project0Render(void);
  69. extern long OpenProject0Window(void);
  70. extern void CloseProject0Window(void);
  71. extern UBYTE ProcessError(ULONG);
  72. extern void BusyOn(void);
  73. extern void BusyOff(void);
  74. extern void FreeCList(void);
  75. extern void FreeMList(void);
  76. extern void TalkConf(void);
  77. extern UBYTE StartTalk(ULONG);
  78. extern struct List *Get_Conference_List(UBYTE *);
  79. extern void _main(void);
  80. extern void Send_PrivateMsg(void);
  81. extern void Send_ToggleMode(void);
  82. extern void Process_CLI(ULONG);
  83. extern struct Node *CFindName(struct List *, STRPTR);
  84.  
  85. // oopss... should go in conf.h
  86.  
  87. ULONG pending=0;
  88.  
  89.  
  90.  
  91.  
  92. /*
  93. ** The "main guts" of the program.  Handles the WorkBench and Shell
  94. ** interface.
  95. */
  96.  
  97. void _main(void)
  98. {
  99.    struct List *conf_list,*memb_list;
  100.    struct Node *ln;
  101.  
  102.    struct c_membnode *current_ln;
  103.    struct c_worknode *ln2;
  104.    
  105.    struct IntuiMessage *mess;
  106.  
  107. /*
  108. ** not implemented yet
  109. ** UBYTE machine_name[32];
  110. */
  111.  
  112.    void *entity;
  113.    ULONG args[4];
  114.    UBYTE done=0;
  115.    struct RDArgs *lpargs;
  116.    ULONG Code,MClass;
  117.    UWORD GADID;
  118.    ULONG loop;
  119.    UBYTE host_name[32];
  120.    struct MsgPort *ConfPort;
  121.    struct Message *ConfMsg;
  122.    struct WBStartup *wbmsg;
  123.    struct WBArg *wbarg;
  124.    char **toolarray;
  125.    char *s;
  126.    struct DiskObject *dobj;
  127.    LONG olddir;
  128.    struct Gadget *gad;
  129.    struct TagItem cbtags[2];
  130.    struct c_membnode *flag_node;
  131.  
  132.    geta4();
  133.  
  134.    cbtags[0].ti_Tag=ENT_AllocSignal;
  135.    cbtags[0].ti_Data=NULL;
  136.    cbtags[1].ti_Tag=TAG_END;
  137.    cbtags[1].ti_Data=NULL;
  138.  
  139.    SysBase=*((struct Library **)4L);
  140.  
  141.    myproc = (struct Process *) FindTask(0L);
  142.    if(!myproc->pr_CLI)
  143.    {
  144.       /* do workbench startup */
  145.    
  146.       WaitPort(&myproc->pr_MsgPort);
  147.       wbmsg=(struct WBStartup *)GetMsg(&myproc->pr_MsgPort);
  148.    }
  149.  
  150.    NewList(&c_worklist);
  151.    NewList(&c_memblist);
  152.    GLB_Error=0;
  153.  
  154.    if(UtilityBase=OpenLibrary("utility.library",37L))
  155.    {
  156.       if (DOSBase = OpenLibrary("dos.library", 37L))
  157.       {
  158.          if (NIPCBase = OpenLibrary("nipc.library", 0L))
  159.          {  
  160.             if (ServicesBase = OpenLibrary("services.library", 37L))
  161.             {
  162.                args[0]=args[1]=args[2]=args[3]=0;
  163.                
  164.                if(lpargs = ReadArgs("Conference,Host/K,LIST/S,Alias/K",args,NULL))
  165.                {
  166.                   if(ConfPort=CreateMsgPort())
  167.                   {
  168.    
  169. // create a unique message port that can be found...  slight overkill
  170.                      
  171.                      sprintf(Conf_Port_Name,"%ld_Conf_Port",myproc);
  172.                      ConfPort->mp_Node.ln_Name=Conf_Port_Name;
  173.                      ConfPort->mp_Node.ln_Pri=1;
  174.                      AddPort(ConfPort);
  175.  
  176.                      if(GetVar("ConferenceHost",conf_host,31,GVF_GLOBAL_ONLY) == -1)
  177.                         conf_host[0]=0;
  178.  
  179.                      if(GetVar("ConferenceAlias",alias,31,GVF_GLOBAL_ONLY) == -1)
  180.                         alias[0]=0;
  181.          
  182.                      if(!myproc->pr_CLI)
  183.                      {
  184.                         /* Process Tool Types */
  185.       
  186.                         if(IconBase=OpenLibrary("icon.library",37l))
  187.                         {
  188.                            wbarg=wbmsg->sm_ArgList;
  189.                            olddir=-1;
  190.                            if((wbarg->wa_Lock) && (*wbarg->wa_Name))
  191.                            {
  192.                               olddir=CurrentDir(wbarg->wa_Lock);
  193.                            }
  194.                            if((*wbarg->wa_Name) && (dobj=GetDiskObject(wbarg->wa_Name)))
  195.                            {
  196.                               toolarray=(char **)dobj->do_ToolTypes;
  197.                               if(s=(char *)FindToolType(toolarray,"Host"))
  198.                               {
  199.                                  strcpy(conf_host,s);
  200.                                  args[1]=(ULONG)&conf_host[0];
  201.                               }
  202.                               if(s=(char *)FindToolType(toolarray,"Alias"))
  203.                               {
  204.                                  strcpy(alias,s);
  205.                                  args[3]=(ULONG)&alias[0];
  206.                               }
  207.                               FreeDiskObject(dobj);
  208.                            } else if(olddir != -1)
  209.                            {
  210.                               CurrentDir(olddir);
  211.                            }
  212.                            CloseLibrary(IconBase);
  213.                         }   
  214.                      }
  215.  
  216.                      if(args[0])
  217.                         strcpy(conf_name,(UBYTE *)args[0]);
  218.                      if(args[1])
  219.                         strcpy(conf_host,(UBYTE *)args[1]);
  220.                      if(args[3])
  221.                         strcpy(alias,(UBYTE *)args[3]);
  222.                         
  223.                      if(entity = CreateEntityA((struct TagItem *) cbtags))
  224.                      {
  225.                         GetHostName(entity,host_name,31);
  226.                         DeleteEntity(entity);
  227.                         if(!alias[0])
  228.                            strcpy(alias,host_name);
  229.                      }
  230.                      else
  231.                         strcpy(host_name,""); 
  232.                      if(!myproc->pr_CLI)
  233.                      {
  234.                         if(IntuitionBase=OpenLibrary("intuition.library",37L))
  235.                         {
  236.                            if(GadToolsBase=OpenLibrary("gadtools.library",37L))
  237.                            {
  238.                               if(!SetupScreen())
  239.                               {
  240.                                  if(!OpenProject0Window())
  241.                                  {
  242.                                     InitRequester(&null_request);
  243.    
  244.                                     if(alias[0])
  245.                                        GT_SetGadgetAttrs(Project0Gadgets[7],Project0Wnd,NULL, GTST_String, alias, TAG_DONE);
  246.                                     if(conf_host[0])
  247.                                     {
  248.                                        GT_SetGadgetAttrs(Project0Gadgets[6],Project0Wnd,NULL, GTST_String, conf_host, TAG_DONE);
  249.                                        GT_SetGadgetAttrs(Project0Gadgets[4],Project0Wnd,NULL,GA_Disabled,FALSE,TAG_DONE);
  250.                                        GT_SetGadgetAttrs(Project0Gadgets[3],Project0Wnd,NULL,GA_Disabled,FALSE,TAG_DONE);
  251.                                        GT_SetGadgetAttrs(Project0Gadgets[0],Project0Wnd,NULL,GTLV_Labels, ~0, TAG_END);
  252.                                        conf_list=Get_Conference_List(NULL);
  253.                                        GT_SetGadgetAttrs(Project0Gadgets[0],Project0Wnd,NULL,GTLV_Labels,conf_list,TAG_END);
  254.                                        ProcessError(GLB_Error);
  255.                                     }
  256.                                     while(!done)
  257.                                     {
  258.                                        Wait((1<<Project0Wnd->UserPort->mp_SigBit) | (1<<ConfPort->mp_SigBit));
  259.                                        while((!done) && (mess=GT_GetIMsg(Project0Wnd->UserPort)))
  260.                                        {
  261.                                           gad=(struct Gadget *)mess->IAddress;
  262.                                           Code=mess->Code;
  263.                                           MClass=mess->Class;
  264.                                           GT_ReplyIMsg(mess);
  265.                                           switch(MClass)
  266.                                           {
  267.                                              case IDCMP_GADGETUP:
  268.                                                 GADID=gad->GadgetID;
  269.                                                 switch(GADID)
  270.                                                 {
  271.                                                    case GD_Gadget00:
  272.                                                       GT_SetGadgetAttrs(Project0Gadgets[1],Project0Wnd,NULL,GA_Disabled, TRUE, TAG_DONE);
  273.                                                       GT_SetGadgetAttrs(Project0Gadgets[5],Project0Wnd,NULL,GA_Disabled, FALSE, TAG_DONE);
  274.                                                       GT_SetGadgetAttrs(Project0Gadgets[9],Project0Wnd,NULL,GA_Disabled, TRUE, TAG_DONE);
  275.                                                       GT_SetGadgetAttrs(Project0Gadgets[2],Project0Wnd,NULL,GA_Disabled, FALSE, TAG_DONE);
  276.                                                       GT_SetGadgetAttrs(Project0Gadgets[10],Project0Wnd,NULL,GA_Disabled, TRUE, TAG_DONE);
  277.                                                       GT_SetGadgetAttrs(Project0Gadgets[11],Project0Wnd,NULL,GA_Disabled, TRUE, GTST_String,NULL, TAG_DONE);
  278.                                                       for(ln=c_worklist.lh_Head,loop=0;((ln->ln_Succ) && (loop<Code));++loop,ln=ln->ln_Succ);
  279.                                                       strcpy(conf_name,ln->ln_Name);
  280.                                                       GT_SetGadgetAttrs(Project0Gadgets[1],Project0Wnd,NULL, GTST_String, conf_name, TAG_DONE);
  281.                                                       GT_SetGadgetAttrs(Project0Gadgets[8],Project0Wnd,NULL,GTLV_Labels, ~0, TAG_END);
  282.                                                       memb_list=Get_Conference_List(conf_name);
  283.                                                       GT_SetGadgetAttrs(Project0Gadgets[8],Project0Wnd,NULL,GTLV_Labels,memb_list,TAG_END);
  284.                                                       ProcessError(GLB_Error);
  285.                                                       break;
  286.                                                    case GD_Gadget10:
  287.                                                       strcpy(conf_name,((struct StringInfo *)Project0Gadgets[1]->SpecialInfo)->Buffer);
  288.                                                       if(strlen(conf_name))
  289.                                                       {
  290.                                                          StartTalk(TKCMD_CONFERENCE);
  291.                                                          GT_SetGadgetAttrs(Project0Gadgets[1],Project0Wnd,NULL,GA_Disabled, TRUE, GTST_String, NULL, TAG_DONE);
  292.                                                          if(GLB_Error)
  293.                                                          {
  294.                                                             GT_SetGadgetAttrs(Project0Gadgets[2],Project0Wnd,NULL,GA_Disabled,TRUE,TAG_DONE);
  295.                                                             GT_SetGadgetAttrs(Project0Gadgets[5],Project0Wnd,NULL,GA_Disabled,TRUE,TAG_DONE);
  296.                                                             ProcessError(GLB_Error);
  297.                                                          }
  298.                                                          else
  299.                                                          {
  300.                                                             GT_SetGadgetAttrs(Project0Gadgets[0],Project0Wnd,NULL,GTLV_Labels, ~0, TAG_END);
  301.                                                             conf_list=Get_Conference_List(NULL);
  302.                                                             GT_SetGadgetAttrs(Project0Gadgets[0],Project0Wnd,NULL,GTLV_Labels,conf_list,TAG_END);
  303.                                                             GT_SetGadgetAttrs(Project0Gadgets[8],Project0Wnd,NULL,GTLV_Labels, ~0, TAG_END);
  304.                                                             memb_list=Get_Conference_List(conf_name);
  305.                                                             GT_SetGadgetAttrs(Project0Gadgets[8],Project0Wnd,NULL,GTLV_Labels,memb_list,TAG_END);
  306.                                                          }
  307.                                                       }
  308.                                                       else
  309.                                                       {
  310.                                                          GT_SetGadgetAttrs(Project0Gadgets[2],Project0Wnd,NULL,GA_Disabled,TRUE,TAG_DONE);
  311.                                                          GT_SetGadgetAttrs(Project0Gadgets[5],Project0Wnd,NULL,GA_Disabled,TRUE,TAG_DONE);
  312.                                                          GT_SetGadgetAttrs(Project0Gadgets[1],Project0Wnd,NULL,GA_Disabled, TRUE, GTST_String, NULL, TAG_DONE);
  313.                                                       }
  314.                                                       break;
  315.                                                    case GD_Gadget20:
  316.                                                       GT_SetGadgetAttrs(Project0Gadgets[9],Project0Wnd,NULL,GA_Disabled, TRUE, TAG_DONE);
  317.                                                       GT_SetGadgetAttrs(Project0Gadgets[10],Project0Wnd,NULL,GA_Disabled, TRUE, TAG_DONE);
  318.                                                       GT_SetGadgetAttrs(Project0Gadgets[11],Project0Wnd,NULL,GA_Disabled, TRUE, GTST_String,NULL, TAG_DONE);
  319.                                                       GT_SetGadgetAttrs(Project0Gadgets[1],Project0Wnd,NULL,GA_Disabled, TRUE, TAG_DONE);
  320.                                                       StartTalk(TKCMD_CONFERENCE);
  321.                                                       GT_SetGadgetAttrs(Project0Gadgets[8],Project0Wnd,NULL,GTLV_Labels, ~0, TAG_END);
  322.                                                       memb_list=Get_Conference_List(conf_name);
  323.                                                       GT_SetGadgetAttrs(Project0Gadgets[8],Project0Wnd,NULL,GTLV_Labels,memb_list,TAG_END);
  324.                                                       ProcessError(GLB_Error);
  325.                                                       break;
  326.                                                    case GD_Gadget30:
  327.                                                       GT_SetGadgetAttrs(Project0Gadgets[9],Project0Wnd,NULL,GA_Disabled, TRUE, TAG_DONE);
  328.                                                       GT_SetGadgetAttrs(Project0Gadgets[10],Project0Wnd,NULL,GA_Disabled, TRUE, TAG_DONE);
  329.                                                       GT_SetGadgetAttrs(Project0Gadgets[11],Project0Wnd,NULL,GA_Disabled, TRUE, GTST_String,NULL, TAG_DONE);
  330.                                                       GT_SetGadgetAttrs(Project0Gadgets[8],Project0Wnd,NULL,GTLV_Labels, NULL, TAG_END);
  331.                                                       GT_SetGadgetAttrs(Project0Gadgets[1],Project0Wnd,NULL,GA_Disabled, FALSE, GTST_String, NULL, TAG_DONE);
  332.                                                       GT_SetGadgetAttrs(Project0Gadgets[2],Project0Wnd,NULL,GA_Disabled, TRUE, TAG_DONE);
  333.                                                       GT_SetGadgetAttrs(Project0Gadgets[5],Project0Wnd,NULL,GA_Disabled, TRUE, TAG_DONE);
  334.                                                       ActivateGadget(Project0Gadgets[1],Project0Wnd,NULL);
  335.                                                       break;
  336.                                                    case GD_Gadget40:
  337.                                                       GT_SetGadgetAttrs(Project0Gadgets[10],Project0Wnd,NULL,GA_Disabled, TRUE, TAG_DONE);
  338.                                                       GT_SetGadgetAttrs(Project0Gadgets[11],Project0Wnd,NULL,GA_Disabled, TRUE, GTST_String,NULL, TAG_DONE);
  339.                                                       GT_SetGadgetAttrs(Project0Gadgets[1],Project0Wnd,NULL,GA_Disabled, TRUE, TAG_DONE);
  340.                                                       GT_SetGadgetAttrs(Project0Gadgets[0],Project0Wnd,NULL,GTLV_Labels, ~0, TAG_END);
  341.                                                       conf_list=Get_Conference_List(NULL);
  342.                                                       GT_SetGadgetAttrs(Project0Gadgets[0],Project0Wnd,NULL,GTLV_Labels,conf_list,TAG_END);
  343.                                                       GT_SetGadgetAttrs(Project0Gadgets[8],Project0Wnd,NULL,GTLV_Labels, NULL, TAG_END);
  344.                                                       GT_SetGadgetAttrs(Project0Gadgets[1],Project0Wnd,NULL,GTST_String,NULL,TAG_DONE);
  345.                                                       GT_SetGadgetAttrs(Project0Gadgets[5],Project0Wnd,NULL,GA_Disabled, TRUE, TAG_DONE);
  346.                                                       GT_SetGadgetAttrs(Project0Gadgets[9],Project0Wnd,NULL,GA_Disabled, TRUE, TAG_DONE);
  347.                                                       GT_SetGadgetAttrs(Project0Gadgets[2],Project0Wnd,NULL,GA_Disabled, TRUE, TAG_DONE);
  348.                                                       GT_SetGadgetAttrs(Project0Gadgets[3],Project0Wnd,NULL,GA_Disabled, FALSE, TAG_DONE);
  349.                                                       ProcessError(GLB_Error);
  350.                                                       break;
  351.                                                    case GD_Gadget50:
  352.                                                       GT_SetGadgetAttrs(Project0Gadgets[10],Project0Wnd,NULL,GA_Disabled, TRUE, TAG_DONE);
  353.                                                       GT_SetGadgetAttrs(Project0Gadgets[11],Project0Wnd,NULL,GA_Disabled, TRUE, GTST_String,NULL, TAG_DONE);
  354.                                                       GT_SetGadgetAttrs(Project0Gadgets[1],Project0Wnd,NULL,GA_Disabled, TRUE, TAG_DONE);
  355.                                                       GT_SetGadgetAttrs(Project0Gadgets[9],Project0Wnd,NULL,GA_Disabled, TRUE, TAG_DONE);
  356.                                                       GT_SetGadgetAttrs(Project0Gadgets[8],Project0Wnd,NULL,GTLV_Labels, ~0, TAG_END);
  357.                                                       memb_list=Get_Conference_List(conf_name);
  358.                                                       GT_SetGadgetAttrs(Project0Gadgets[8],Project0Wnd,NULL,GTLV_Labels,memb_list,TAG_END);
  359.                                                       ProcessError(GLB_Error);
  360.                                                       break;
  361.                                                    case GD_Gadget60:
  362.                                                       strcpy(conf_host,((struct StringInfo *)Project0Gadgets[6]->SpecialInfo)->Buffer);
  363.                                                       GT_SetGadgetAttrs(Project0Gadgets[0],Project0Wnd,NULL,GTLV_Labels, ~0, TAG_END);
  364.                                                       conf_list=Get_Conference_List(NULL);
  365.                                                       GT_SetGadgetAttrs(Project0Gadgets[0],Project0Wnd,NULL,GTLV_Labels,conf_list,TAG_END);
  366.                                                       if(GLB_Error)
  367.                                                       {
  368.                                                          GT_SetGadgetAttrs(Project0Gadgets[4],Project0Wnd,NULL,GA_Disabled,TRUE,TAG_DONE);
  369.                                                          GT_SetGadgetAttrs(Project0Gadgets[3],Project0Wnd,NULL,GA_Disabled,TRUE,TAG_DONE);
  370.                                                          GT_SetGadgetAttrs(Project0Gadgets[1],Project0Wnd,NULL,GTST_String,NULL,GA_Disabled,TRUE,TAG_DONE);
  371.                                                          GT_SetGadgetAttrs(Project0Gadgets[2],Project0Wnd,NULL,GA_Disabled,TRUE,TAG_DONE);
  372.                                                          GT_SetGadgetAttrs(Project0Gadgets[5],Project0Wnd,NULL,GA_Disabled,TRUE,TAG_DONE);
  373.                                                          GT_SetGadgetAttrs(Project0Gadgets[8],Project0Wnd,NULL,GTLV_Labels,NULL,TAG_END);
  374.                                                          GT_SetGadgetAttrs(Project0Gadgets[0],Project0Wnd,NULL,GTLV_Labels,NULL,TAG_END);
  375.                                                          ProcessError(GLB_Error);
  376.                                                       }
  377.                                                       else
  378.                                                       {
  379.                                                          GT_SetGadgetAttrs(Project0Gadgets[4],Project0Wnd,NULL,GA_Disabled,FALSE,TAG_DONE);
  380.                                                          GT_SetGadgetAttrs(Project0Gadgets[3],Project0Wnd,NULL,GA_Disabled,FALSE,TAG_DONE);
  381.                                                       }
  382.                                                       GT_SetGadgetAttrs(Project0Gadgets[1],Project0Wnd,NULL,GA_Disabled, TRUE, GTST_String, NULL, TAG_DONE);
  383.                                                       break;
  384.                                                    case GD_Gadget70:
  385.                                                       strcpy(alias,((struct StringInfo *)Project0Gadgets[7]->SpecialInfo)->Buffer);
  386.                                                       break;
  387.                                                    case GD_Gadget80:
  388.                                                       for(ln=c_memblist.lh_Head,loop=0;((ln->ln_Succ) && (loop<Code));++loop,ln=ln->ln_Succ);
  389.                                                       strcpy(machine_name,((struct c_membnode *)ln)->name);
  390.    
  391.                                                       if(CFindName(&c_memblist,alias))
  392.                                                       {
  393.                                                          /* If I'm in the list... */
  394.                                                          
  395.                                                          if(!Stricmp(machine_name,host_name))
  396.                                                          {
  397.                                                              /* Hey - I selected myself!!! */
  398.    
  399.                                                              GT_SetGadgetAttrs(Project0Gadgets[11],Project0Wnd,NULL,GA_Disabled, TRUE, GTST_String,NULL, TAG_DONE);
  400.                                                              GT_SetGadgetAttrs(Project0Gadgets[1],Project0Wnd,NULL,GA_Disabled, TRUE, TAG_DONE);
  401.                                                              GT_SetGadgetAttrs(Project0Gadgets[10],Project0Wnd,NULL,GA_Disabled, TRUE, TAG_DONE);
  402.                                                              GT_SetGadgetAttrs(Project0Gadgets[9],Project0Wnd,NULL,GA_Disabled, TRUE, GTCY_Active,0,TAG_DONE);
  403.                                                          } else
  404.                                                          {
  405.                                                              /* Hey - I selected someone else!!! */
  406.                                                              
  407.                                                              if(flag_node=(struct c_membnode *)CFindName(&c_memblist,machine_name))
  408.                                                              {
  409.                                                                  GT_SetGadgetAttrs(Project0Gadgets[10],Project0Wnd,NULL,GA_Disabled, FALSE, TAG_DONE);
  410.                                                                  GT_SetGadgetAttrs(Project0Gadgets[9],Project0Wnd,NULL,GA_Disabled, FALSE, GTCY_Active,flag_node->flags,TAG_DONE);
  411.                                                              } else
  412.                                                              {
  413.                                                                  GT_SetGadgetAttrs(Project0Gadgets[10],Project0Wnd,NULL,GA_Disabled, TRUE, TAG_DONE);
  414.                                                                  GT_SetGadgetAttrs(Project0Gadgets[9],Project0Wnd,NULL,GA_Disabled, TRUE, GTCY_Active,0,TAG_DONE);
  415.                                                              }
  416.                                                              GT_SetGadgetAttrs(Project0Gadgets[11],Project0Wnd,NULL,GA_Disabled, TRUE, GTST_String,NULL, TAG_DONE);
  417.                                                              GT_SetGadgetAttrs(Project0Gadgets[1],Project0Wnd,NULL,GA_Disabled, TRUE, TAG_DONE);
  418.                                                         }
  419.                                                       }
  420.                                                       else
  421.                                                       {
  422.                                                          /* Hey - I not even in the conference!!! Disable ALL */
  423.                                                          
  424.                                                          GT_SetGadgetAttrs(Project0Gadgets[11],Project0Wnd,NULL,GA_Disabled, TRUE, GTST_String,NULL, TAG_DONE);
  425.                                                          GT_SetGadgetAttrs(Project0Gadgets[1],Project0Wnd,NULL,GA_Disabled, TRUE, TAG_DONE);
  426.                                                          GT_SetGadgetAttrs(Project0Gadgets[10],Project0Wnd,NULL,GA_Disabled, TRUE, TAG_DONE);
  427.                                                          GT_SetGadgetAttrs(Project0Gadgets[9],Project0Wnd,NULL,GA_Disabled, TRUE, GTCY_Active,0,TAG_DONE);
  428.                                                       }
  429.                                                       break;
  430.                                                    case GD_Gadget90:
  431.                                                       GT_SetGadgetAttrs(Project0Gadgets[1],Project0Wnd,NULL,GA_Disabled, TRUE, TAG_DONE);
  432.                                                       GT_SetGadgetAttrs(Project0Gadgets[11],Project0Wnd,NULL,GA_Disabled, TRUE, GTST_String,NULL,TAG_DONE);
  433.    
  434.                                                       cycle_mode=Code;
  435.                                                       Send_ToggleMode();
  436.    
  437.                                                       if(flag_node=(struct c_membnode *)CFindName(&c_memblist,machine_name))
  438.                                                       {
  439.                                                           flag_node->flags=cycle_mode;
  440.                                                       }
  441.    
  442.                                                       break;
  443.                                                    case GD_Gadget100:
  444.                                                       GT_SetGadgetAttrs(Project0Gadgets[11],Project0Wnd,NULL,GA_Disabled, FALSE, GTST_String, NULL, TAG_DONE);
  445.                                                       ActivateGadget(Project0Gadgets[11],Project0Wnd,NULL);
  446.                                                       break;
  447.                                                    case GD_Gadget110:
  448.                                                       strcpy(pri_msg,((struct StringInfo *)Project0Gadgets[11]->SpecialInfo)->Buffer);
  449.                                                       GT_SetGadgetAttrs(Project0Gadgets[11],Project0Wnd,NULL,GA_Disabled, TRUE, GTST_String, NULL, TAG_DONE);
  450.                                                       Send_PrivateMsg();
  451.                                                       break;
  452.                                                 }
  453.                                                 break;
  454.                                              case IDCMP_CLOSEWINDOW:
  455.                                                 done=1;
  456.                                                 break;
  457.                                           }
  458.                                        }
  459.                                        if(ConfMsg=GetMsg(ConfPort))
  460.                                        {
  461.                                           GT_SetGadgetAttrs(Project0Gadgets[1],Project0Wnd,NULL,GA_Disabled, TRUE, TAG_DONE);
  462.                                           GT_SetGadgetAttrs(Project0Gadgets[0],Project0Wnd,NULL,GTLV_Labels, ~0, TAG_END);
  463.                                           conf_list=Get_Conference_List(NULL);
  464.                                           GT_SetGadgetAttrs(Project0Gadgets[0],Project0Wnd,NULL,GTLV_Labels,conf_list,TAG_END);
  465.                                           GT_SetGadgetAttrs(Project0Gadgets[8],Project0Wnd,NULL,GTLV_Labels, NULL, TAG_END);
  466.                                           GT_SetGadgetAttrs(Project0Gadgets[1],Project0Wnd,NULL,GA_Disabled,TRUE,GTST_String,NULL,TAG_DONE);
  467.                                           GT_SetGadgetAttrs(Project0Gadgets[5],Project0Wnd,NULL,GA_Disabled, TRUE, TAG_DONE);
  468.                                           GT_SetGadgetAttrs(Project0Gadgets[9],Project0Wnd,NULL,GA_Disabled, TRUE, TAG_DONE);
  469.                                           GT_SetGadgetAttrs(Project0Gadgets[2],Project0Wnd,NULL,GA_Disabled, TRUE, TAG_DONE);
  470.                                           GT_SetGadgetAttrs(Project0Gadgets[3],Project0Wnd,NULL,GA_Disabled, FALSE, TAG_DONE);
  471.                                           GT_SetGadgetAttrs(Project0Gadgets[11],Project0Wnd,NULL,GA_Disabled,TRUE,GTST_String,NULL,TAG_DONE);
  472.                                           GT_SetGadgetAttrs(Project0Gadgets[10],Project0Wnd,NULL,GA_Disabled, TRUE, TAG_DONE);
  473.                                           ProcessError(GLB_Error);
  474.                                        }
  475.                                     }
  476.                                  }
  477.                                  CloseProject0Window();
  478.                               }
  479.                               CloseDownScreen();
  480.                            }
  481.                            CloseLibrary(GadToolsBase);
  482.                         }
  483.                         CloseLibrary(IntuitionBase);
  484.                      }
  485.                      else
  486.                      {
  487.                         if(!strlen(conf_host))
  488.                            FPrintf(Output(),"\nConference host name not supplied.\n\n");
  489.                         else
  490.                         {
  491.                            if(args[2])
  492.                            {
  493.                               if(!strlen(conf_name))
  494.                               {
  495.                                  conf_list=Get_Conference_List(NULL);
  496.                                  if(!GLB_Error)
  497.                                  {
  498.                                    if(conf_list)
  499.                                    {
  500.                                     FPrintf(Output(),"\nAvailable conferences on %s\n",conf_host);
  501.                                     for(ln=conf_list->lh_Head;ln->ln_Succ;ln=ln->ln_Succ)
  502.                                     {
  503.                                        ln2=(struct c_worknode *)ln;
  504.                                        FPrintf(Output(),"%s\n",ln2->name);
  505.                                     }
  506.                                    } else
  507.                                    {
  508.                                     FPrintf(Output(),"\nNo conferences available on %s\n",conf_host);
  509.                                    }
  510.                                  }
  511.                                  else
  512.                                     Process_CLI(GLB_Error);
  513.                               }
  514.                               else
  515.                               {
  516.                                  memb_list=Get_Conference_List(conf_name);
  517.                                  if(!GLB_Error)
  518.                                  {
  519.                                     if(memb_list)
  520.                                     {
  521.                                            FPrintf(Output(),"Users in conference %s on %s\n",conf_name,conf_host);
  522.                                             for(ln=memb_list->lh_Head;ln->ln_Succ;ln=ln->ln_Succ)
  523.                                             {
  524.                                                current_ln=(struct c_membnode *)ln;
  525.                                                FPrintf(Output(),"%-32s - %-32s\n",current_ln->name,current_ln->alias);
  526.                                             }
  527.                                     } else
  528.                                     {
  529.                                            FPrintf(Output(),"\n%s conference does not exist on %s\n",conf_name,conf_host);
  530.                                     }
  531.                                  }
  532.                                  else
  533.                                     Process_CLI(GLB_Error);
  534.                               }
  535.                            }
  536.                            else
  537.                            {
  538.                               if(strlen(conf_name))
  539.                               {
  540.                                  StartTalk(TKCMD_CONFERENCE);
  541.                                  if(GLB_Error)
  542.                                  {
  543.                                     Process_CLI(GLB_Error);
  544.                                  }
  545.                               }
  546.                               else
  547.                                  FPrintf(Output(),"\nConference name not supplied.\n");
  548.                            }
  549.                            FPrintf(Output(),"\n");
  550.                         }
  551.                      }
  552.                      FreeCList();
  553.                      FreeMList();
  554.                      while(pending)
  555.                      {
  556.                         Wait(1<<ConfPort->mp_SigBit);
  557.                      }
  558.                      RemPort(ConfPort);
  559.                      DeleteMsgPort(ConfPort);
  560.                   }   
  561.                   FreeArgs(lpargs);
  562.                }
  563.                CloseLibrary(ServicesBase);
  564.             }
  565.             CloseLibrary(NIPCBase);
  566.          }
  567.          CloseLibrary(DOSBase);
  568.       }
  569.       CloseLibrary(UtilityBase);
  570.    }
  571.    if(!myproc->pr_CLI)
  572.    {
  573.       Forbid();
  574.       ReplyMsg((struct Message *)wbmsg);
  575.    }
  576. }
  577.  
  578.  
  579.  
  580.  
  581. /**************************************************************************
  582. User Interface Created with GadToolsBox - will be replaced with my font
  583. sensitive layout engine some day if I find a practical use for this
  584. program.
  585. **************************************************************************/
  586.  
  587. long SetupScreen( void )
  588. {
  589.     if ( NOT( Scr = LockPubScreen( NULL )))
  590.         return( 1L );
  591.  
  592.     if ( NOT( VisualInfo = GetVisualInfo( Scr, TAG_DONE )))
  593.         return( 2L );
  594.  
  595.     return( NULL );
  596. }
  597.  
  598. void CloseDownScreen( void )
  599. {
  600.     if ( VisualInfo ) {
  601.         FreeVisualInfo( VisualInfo );
  602.         VisualInfo = NULL;
  603.     }
  604.  
  605.     if ( Scr        ) {
  606.         UnlockPubScreen( NULL, Scr );
  607.         Scr = NULL;
  608.     }
  609. }
  610.  
  611. void Project0Render( void )
  612. {
  613.     UWORD        offx, offy;
  614.  
  615.     offx = Project0Wnd->BorderLeft;
  616.     offy = Project0Wnd->BorderTop;
  617.  
  618.     PrintIText( Project0Wnd->RPort, Project0IText, offx, offy );
  619. }
  620.  
  621. long OpenProject0Window( void )
  622. {
  623.     struct NewGadget     ng;
  624.     struct Gadget       *g;
  625.     UWORD               offx, offy;
  626.  
  627.     offx = Scr->WBorLeft;
  628.     offy = Scr->WBorTop + Scr->RastPort.TxHeight + 1;
  629.  
  630.     if ( NOT( g = CreateContext( &Project0GList )))
  631.         return( 1L );
  632.  
  633.     ng.ng_LeftEdge        =    offx + 16;
  634.     ng.ng_TopEdge         =    offy + 16;
  635.     ng.ng_Width           =    233;
  636.     ng.ng_Height          =    125;
  637.     ng.ng_GadgetText      =    (UBYTE *)"Conference";
  638.     ng.ng_TextAttr        =    &topaz8;
  639.     ng.ng_GadgetID        =    GD_Gadget00;
  640.     ng.ng_Flags           =    PLACETEXT_ABOVE|NG_HIGHLABEL;
  641.     ng.ng_VisualInfo      =    VisualInfo;
  642.  
  643.     g = CreateGadget( LISTVIEW_KIND, g, &ng, GTLV_Labels, NULL, TAG_DONE );
  644.  
  645.     Project0Gadgets[ 0 ] = g;
  646.  
  647.     ng.ng_TopEdge         =    offy + 140;
  648.  
  649. // Layout Fix!!
  650. // ng.ng_Height          =    13;
  651.  
  652.     ng.ng_Height = 14;
  653.     ng.ng_GadgetText      =    NULL;
  654.     ng.ng_GadgetID        =    GD_Gadget10;
  655.     ng.ng_Flags           =    0;
  656.  
  657.     g = CreateGadget( STRING_KIND, g, &ng, GTST_MaxChars, 256, GA_Disabled, TRUE, TAG_DONE );
  658.  
  659.     Project0Gadgets[ 1 ] = g;
  660.  
  661.     ng.ng_TopEdge         =    offy + 154;
  662.     ng.ng_Width           =    117;
  663.     ng.ng_Height          =    15;
  664.     ng.ng_GadgetText      =    (UBYTE *)"Enter";
  665.     ng.ng_GadgetID        =    GD_Gadget20;
  666.  
  667.     g = CreateGadget( BUTTON_KIND, g, &ng, GA_Disabled, TRUE, TAG_DONE );
  668.  
  669.     Project0Gadgets[ 2 ] = g;
  670.  
  671.     ng.ng_LeftEdge        =    offx + 133;
  672.     ng.ng_Width           =    116;
  673.     ng.ng_GadgetText      =    (UBYTE *)"Create";
  674.     ng.ng_GadgetID        =    GD_Gadget30;
  675.  
  676.     g = CreateGadget( BUTTON_KIND, g, &ng, GA_Disabled, TRUE, TAG_DONE );
  677.  
  678.     Project0Gadgets[ 3 ] = g;
  679.  
  680.     ng.ng_LeftEdge        =    offx + 16;
  681.     ng.ng_TopEdge         =    offy + 169;
  682.     ng.ng_Width           =    117;
  683.     ng.ng_GadgetText      =    (UBYTE *)"List";
  684.     ng.ng_GadgetID        =    GD_Gadget40;
  685.  
  686.     g = CreateGadget( BUTTON_KIND, g, &ng, GA_Disabled, TRUE, TAG_DONE );
  687.  
  688.     Project0Gadgets[ 4 ] = g;
  689.  
  690.     ng.ng_LeftEdge        =    offx + 133;
  691.     ng.ng_Width           =    116;
  692.     ng.ng_GadgetText      =    (UBYTE *)"Members";
  693.     ng.ng_GadgetID        =    GD_Gadget50;
  694.  
  695.     g = CreateGadget( BUTTON_KIND, g, &ng, GA_Disabled, TRUE, TAG_DONE );
  696.  
  697.     Project0Gadgets[ 5 ] = g;
  698.  
  699.     ng.ng_LeftEdge        =    offx + 321;
  700.     ng.ng_TopEdge         =    offy + 16;
  701.     ng.ng_Width           =    229;
  702.     ng.ng_Height = 14;
  703.     ng.ng_GadgetText      =    (UBYTE *)"Host";
  704.     ng.ng_GadgetID        =    GD_Gadget60;
  705.     ng.ng_Flags           =    PLACETEXT_LEFT;
  706.  
  707.     g = CreateGadget( STRING_KIND, g, &ng, GTST_MaxChars, 256, TAG_DONE );
  708.  
  709.     Project0Gadgets[ 6 ] = g;
  710.  
  711.     ng.ng_TopEdge         =    offy + 37;
  712.     ng.ng_GadgetText      =    (UBYTE *)"Alias";
  713.     ng.ng_GadgetID        =    GD_Gadget70;
  714.  
  715.     g = CreateGadget( STRING_KIND, g, &ng, GTST_MaxChars, 256, TAG_DONE );
  716.  
  717.     Project0Gadgets[ 7 ] = g;
  718.  
  719.     ng.ng_LeftEdge        =    offx + 276;
  720.     ng.ng_TopEdge         =    offy + 72;
  721.     ng.ng_Width           =    275;
  722.     ng.ng_Height          =    81;
  723.     ng.ng_GadgetText      =    (UBYTE *)"Members of Conference";
  724.     ng.ng_GadgetID        =    GD_Gadget80;
  725.     ng.ng_Flags           =    PLACETEXT_ABOVE|NG_HIGHLABEL;
  726.  
  727.     g = CreateGadget( LISTVIEW_KIND, g, &ng, GTLV_Labels, NULL, GTLV_ShowSelected, NULL, TAG_DONE );
  728.  
  729.     Project0Gadgets[ 8 ] = g;
  730.  
  731.     ng.ng_TopEdge         =    offy + 152;
  732.     ng.ng_Width           =    139;
  733.     ng.ng_Height          =    15;
  734.     ng.ng_GadgetText      =    NULL;
  735.     ng.ng_GadgetID        =    GD_Gadget90;
  736.     ng.ng_Flags           =    0;
  737.  
  738.     g = CreateGadget( CYCLE_KIND, g, &ng, GTCY_Active,0,GTCY_Labels, &Gadget900Labels[0], GA_Disabled, TRUE, TAG_DONE );
  739.  
  740.     Project0Gadgets[ 9 ] = g;
  741.  
  742.     ng.ng_LeftEdge        =    offx + 415;
  743.     ng.ng_Width           =    136;
  744.     ng.ng_GadgetText      =    (UBYTE *)"Private Msg";
  745.     ng.ng_GadgetID        =    GD_Gadget100;
  746.     ng.ng_Flags           =    PLACETEXT_IN;
  747.  
  748.     g = CreateGadget( BUTTON_KIND, g, &ng, GA_Disabled, TRUE, TAG_DONE );
  749.  
  750.     Project0Gadgets[ 10 ] = g;
  751.  
  752.     ng.ng_LeftEdge        =    offx + 276;
  753.     ng.ng_TopEdge         =    offy + 167;
  754.     ng.ng_Width           =    275;
  755.     ng.ng_Height = 14;
  756.     ng.ng_GadgetText      =    NULL;
  757.     ng.ng_GadgetID        =    GD_Gadget110;
  758.     ng.ng_Flags           =    0;
  759.  
  760.     g = CreateGadget( STRING_KIND, g, &ng, GTST_MaxChars, 256, GA_Disabled, TRUE, TAG_DONE );
  761.  
  762.     Project0Gadgets[ 11 ] = g;
  763.  
  764.     if ( NOT g )
  765.         return( 2L );
  766.  
  767.     if ( NOT( Project0Wnd = OpenWindowTags( NULL,
  768.                     WA_Left,          Project0Left,
  769.                     WA_Top,           Project0Top,
  770.                     WA_Width,         Project0Width,
  771.                     WA_Height,        Project0Height + offy,
  772.                     WA_IDCMP,         LISTVIEWIDCMP|STRINGIDCMP|BUTTONIDCMP|CYCLEIDCMP|IDCMP_MOUSEBUTTONS|IDCMP_MOUSEMOVE|IDCMP_MENUPICK|IDCMP_CLOSEWINDOW|IDCMP_REFRESHWINDOW,
  773.                     WA_Flags,         WFLG_ACTIVATE|WFLG_DRAGBAR|WFLG_DEPTHGADGET|WFLG_CLOSEGADGET|WFLG_SMART_REFRESH,
  774.                     WA_Gadgets,       Project0GList,
  775.                     WA_Title,         Project0Wdt,
  776.                     WA_ScreenTitle,   "Conference v1.0",
  777.                     WA_PubScreen,     Scr,
  778.                         TAG_DONE )))
  779.         return( 4L );
  780.  
  781.     GT_RefreshWindow( Project0Wnd, NULL );
  782.  
  783.     Project0Render();
  784.  
  785.     return( NULL );
  786. }
  787.  
  788. void CloseProject0Window( void )
  789. {
  790.     if ( Project0Wnd        ) {
  791.         CloseWindow( Project0Wnd );
  792.         Project0Wnd = NULL;
  793.     }
  794.  
  795.     if ( Project0GList      ) {
  796.         FreeGadgets( Project0GList );
  797.         Project0GList = NULL;
  798.     }
  799. }
  800.  
  801.  
  802.  
  803.  
  804. // Process error code passed to it
  805. // Could be optimized...
  806.  
  807. UBYTE ProcessError(ULONG error)
  808. {
  809.    UBYTE answer;
  810.    struct EasyStruct es = {sizeof(struct EasyStruct),0,"Conference Request",NULL,"Cancel"};
  811.       
  812.    temp_request=Request(&null_request,Project0Wnd);
  813.    if(error == 1)
  814.    {
  815.       es.es_TextFormat="General Error";
  816.       answer=EasyRequest(NULL,&es,NULL,NULL,NULL);
  817.    }
  818.    else if(error == 2)
  819.    {
  820.       es.es_TextFormat="Unable to find conference\nservice and host";
  821.       answer=EasyRequest(NULL,&es,NULL,NULL,NULL);
  822.    }
  823.    else if(error == 3)
  824.    {
  825.       es.es_TextFormat="Already in this conference!";
  826.       answer=EasyRequest(NULL,&es,NULL,NULL,NULL);
  827.    }
  828.    else if(error == 4)
  829.    {
  830.       es.es_TextFormat="Conference doesn't exist anymore.";
  831.       answer=EasyRequest(NULL,&es,NULL,NULL,NULL);
  832.    }
  833.    else if(error == 5)
  834.    {
  835.       es.es_TextFormat="Conference already exists!";
  836.       answer=EasyRequest(NULL,&es,NULL,NULL,NULL);
  837.    }
  838.    else if(error == 13)
  839.    {
  840.       es.es_TextFormat="Server couldn't finish request!";
  841.       answer=EasyRequest(NULL,&es,NULL,NULL,NULL);
  842.    }
  843.    else if(error & 0x10000)
  844.    {
  845.       es.es_TextFormat="Transaction failure: %ld";
  846.       answer=EasyRequest(NULL,&es,NULL,(error & 0x0ffff),NULL);
  847.    }
  848.    if(temp_request)
  849.       EndRequest(&null_request,Project0Wnd);
  850.    return(answer);
  851. }         
  852.  
  853.  
  854.  
  855. // Should be combined with ProcessError()
  856.  
  857. void Process_CLI(ULONG error)
  858. {
  859.    UBYTE string[80];
  860.    
  861.    if(error == 1)
  862.    {
  863.       strcpy(string,"General Error.");
  864.    }
  865.    else if(error == 2)
  866.    {
  867.       strcpy(string,"Unable to find conference service and host.");
  868.    }
  869.    else if(error == 3)
  870.    {
  871.       strcpy(string,"Already in this conference!");
  872.    }
  873.    else if(error == 4)
  874.    {
  875.       strcpy(string,"Conference doesn't exist anymore.");
  876.    }
  877.    else if(error == 5)
  878.    {
  879.       strcpy(string,"Conference already exists!");
  880.    }
  881.    else if(error = 13)
  882.    {
  883.       strcpy(string,"Server couldn't finish request!");
  884.    }
  885.    else if(error & 0x10000)
  886.    {
  887.       sprintf(string,"Transaction failure: %ld",(error & 0x0ffff));
  888.    }
  889.    FPrintf(Output(),"\n%s\n\n",string);
  890. }         
  891.  
  892.  
  893.  
  894. /* Turn on busy pointer */
  895.  
  896. void BusyOn(void)
  897. {
  898.    extern UWORD __chip waitPointer[];
  899.    
  900.    if(!myproc->pr_CLI)
  901.    {
  902.       temp_request=Request(&null_request,Project0Wnd);
  903.       SetPointer(Project0Wnd,waitPointer,16,16,-6,0);
  904.    }
  905. }
  906.  
  907.  
  908.  
  909. /* Turn off busy pointer */
  910.  
  911. void BusyOff(void)
  912. {
  913.    extern UWORD __chip waitPointer[];
  914.    
  915.    if(!myproc->pr_CLI)
  916.    {
  917.       ClearPointer(Project0Wnd);
  918.       if(temp_request)
  919.          EndRequest(&null_request,Project0Wnd);
  920.    }
  921. }
  922.  
  923.    
  924.  
  925. /* Free up the conference list */
  926.  
  927. void FreeCList(void)
  928. {
  929.    struct Node *ln;
  930.    
  931.    while(ln=RemHead(&c_worklist))
  932.       FreeMem(ln,sizeof(struct c_worknode));
  933.    NewList(&c_worklist);
  934. }
  935.  
  936.  
  937.  
  938. /* Free up the member list of a conference */
  939.  
  940. void FreeMList(void)
  941. {
  942.    struct Node *ln;
  943.    
  944.    while(ln=RemHead(&c_memblist))
  945.       FreeMem(ln,sizeof(struct c_membnode));
  946.    NewList(&c_memblist);
  947. }
  948.  
  949.  
  950.  
  951.  
  952. /*
  953. ** Attempts to startup a conference.  If successful, it opens an input
  954. ** and output window for that conference.
  955. **
  956. ** Error Code (in GLB_Error):
  957. **
  958. ** 1 - General failure
  959. ** 2 - Unable to find host/serivce
  960. ** 0x10000 - Transaction error
  961. **
  962. **
  963. **
  964. ** Poor choice to use global vars with a routine that's called multiple
  965. ** times simulatenously.
  966. **
  967. */
  968.  
  969. void TalkConf(void)
  970. {
  971.    struct Transaction *trans,*a_trans;
  972.    void *entity,*dest,*a_entity;
  973.    UBYTE host_name[32],work_space[512],userinput[256];
  974.    BPTR input_w,output_w;
  975.    struct MsgPort *port,*replyport,*Conf_Port;
  976.    struct StandardPacket *packet;
  977.    UBYTE done=0;
  978.    ULONG error;
  979.    ULONG waitmask,signal,howmany,m_id,sigbit=0;
  980.    struct TagItem cetags[4];
  981.    struct TagItem cbtags[2];
  982.    struct TagItem ttags[3];
  983.  
  984.  
  985.    geta4();
  986.    
  987.    cetags[0].ti_Tag=ENT_Name;
  988.    cetags[0].ti_Data=NULL;
  989.    cetags[1].ti_Tag=ENT_Public;
  990.    cetags[1].ti_Data=NULL;
  991.    cetags[2].ti_Tag=ENT_AllocSignal;
  992.    cetags[2].ti_Data=NULL;
  993.    cetags[3].ti_Tag=TAG_END;
  994.    cetags[3].ti_Data=NULL;
  995.  
  996.    cbtags[0].ti_Tag=ENT_AllocSignal;
  997.    cbtags[0].ti_Data=NULL;
  998.    cbtags[1].ti_Tag=TAG_END;
  999.    cbtags[1].ti_Data=NULL;
  1000.    
  1001.    ttags[0].ti_Tag=TRN_AllocReqBuffer;
  1002.    ttags[0].ti_Data=516;
  1003.    ttags[1].ti_Tag=TRN_AllocRespBuffer;
  1004.    ttags[1].ti_Data=4;
  1005.    ttags[2].ti_Tag=TAG_END;
  1006.    ttags[2].ti_Data=NULL;
  1007.    
  1008.    error=1;
  1009.    if(entity = CreateEntityA((struct TagItem *) cbtags))
  1010.    {
  1011.       error=2;
  1012.       if(dest = FindServiceA(conf_host, "Conf_Service", entity, NULL))
  1013.       {
  1014.          error=1;
  1015.          if(trans = AllocTransactionA((struct TagItem *) ttags))
  1016.          {
  1017.             cetags[2].ti_Data=(ULONG) &sigbit;
  1018.             cetags[0].ti_Data=(ULONG) conf_name;
  1019.             if(a_entity=CreateEntityA((struct TagItem *) cetags))
  1020.             {
  1021.                GetHostName(entity,host_name,31);
  1022.                strcpy(((UBYTE *)trans->trans_RequestData+4),conf_name);
  1023.                strcpy(((UBYTE *)trans->trans_RequestData+36),host_name);
  1024.                strcpy(((UBYTE *)trans->trans_RequestData+68),alias);
  1025.                trans->trans_ReqDataActual=strlen(alias)+69;
  1026.                trans->trans_Command=TKCommand;
  1027.                trans->trans_Timeout=10;
  1028.                DoTransaction(dest,entity,trans);
  1029.  
  1030.                error=trans->trans_Error | 0x10000;
  1031.  
  1032.                if(!trans->trans_Error)
  1033.                {
  1034.                   error=1;
  1035.                   m_id=*(ULONG *)trans->trans_ResponseData;
  1036.  
  1037.                   /*
  1038.                   if(alias[0])
  1039.                   {
  1040.                      strcpy(host_name,alias);
  1041.                   }
  1042.                   */
  1043.                   
  1044.                   sprintf(work_space,"CON:0/0/640/150/Output - %s",conf_name);
  1045.                   if(output_w=(BPTR)Open(work_space,MODE_NEWFILE))
  1046.                   {
  1047.                         
  1048.                      //sprintf(work_space,"ID #: %ld\n\n",m_id);
  1049.                      //Write(output_w,work_space,strlen(work_space));
  1050.  
  1051.                      sprintf(work_space,"CON:0/150/640/50/Input - %s/CLOSE",conf_name);
  1052.                      if(input_w=(BPTR)Open(work_space,MODE_NEWFILE))
  1053.                      {
  1054.                         if(packet=(struct StandardPacket *)AllocMem((long)sizeof(struct StandardPacket),MEMF_PUBLIC|MEMF_CLEAR))
  1055.                         {
  1056.                            port=(struct MsgPort *) (((struct FileHandle *)((ULONG)input_w<<2))->fh_Type);
  1057.                            if(replyport=(struct MsgPort *) CreateMsgPort())
  1058.                            {
  1059.                               ++pending;
  1060.                               error=0;
  1061.                               GLB_Error=error;
  1062.                               Signal(TKProc, TKSignalMask);                                                           
  1063.  
  1064. // broadcast that you've entered the conference - could be optimized
  1065.  
  1066.                               sprintf(work_space,"[%s has entered.]\n",alias);
  1067.                               Write(output_w,work_space,strlen(work_space));
  1068.                               trans->trans_Command=TKCMD_CONDATA;
  1069.                               strcpy(((UBYTE *)trans->trans_RequestData+4),work_space);
  1070.                               *(ULONG *)trans->trans_RequestData=m_id;
  1071.                               trans->trans_ReqDataActual=strlen(work_space)+5;
  1072.                               trans->trans_Timeout=10;
  1073.                               DoTransaction(dest,entity,trans);
  1074.  
  1075. // process trans failure!!!
  1076. // Not very critical...
  1077.  
  1078.                               packet->sp_Msg.mn_Node.ln_Name=(char *)&(packet->sp_Pkt);
  1079.                               packet->sp_Pkt.dp_Link=&(packet->sp_Msg);
  1080.                               packet->sp_Pkt.dp_Port=replyport;
  1081.                               packet->sp_Pkt.dp_Type=ACTION_WAIT_CHAR;
  1082.                               packet->sp_Pkt.dp_Arg1=34000;
  1083.                               SendPkt(&packet->sp_Pkt,port,replyport);
  1084.                                              
  1085.                               waitmask = (1<<replyport->mp_SigBit) | (1<<sigbit);
  1086.  
  1087.                               while(!done)
  1088.                               {
  1089.                                  signal = Wait(waitmask);
  1090.                                  
  1091.                                  if(signal & (1<<replyport->mp_SigBit))
  1092.                                  { 
  1093.                                     if(GetMsg(replyport))
  1094.                                     {
  1095.                                        if(packet->sp_Pkt.dp_Res1)
  1096.                                        {
  1097.                                           if(!(howmany=Read(input_w,userinput,255)))
  1098.                                           {
  1099.  
  1100. // broadcast that you're leaving the conference - could be optimized
  1101.  
  1102.                                              sprintf(work_space,"[%s has exited.]\n",alias);
  1103.                                              Write(output_w,work_space,strlen(work_space));
  1104.                                              trans->trans_Command=TKCMD_CONDATA;
  1105.                                              strcpy(((UBYTE *)trans->trans_RequestData+4),work_space);
  1106.                                              *(ULONG *)trans->trans_RequestData=m_id;
  1107.                                              trans->trans_ReqDataActual=strlen(work_space)+5;
  1108.                                              trans->trans_Timeout=10;
  1109.                                              DoTransaction(dest,entity,trans);
  1110. // process trans failure!!!
  1111. // Not very critical
  1112.  
  1113.                                              done=2;
  1114.                                           }
  1115.                                           else
  1116.                                           {
  1117.                                              if(howmany)
  1118.                                              {
  1119.                                                 if(userinput[howmany-1] == '\n')
  1120.                                                 {
  1121.                                                     --howmany;
  1122.                                                 }
  1123.                                              }
  1124.                                              userinput[howmany]=0;
  1125.  
  1126.                                              sprintf(work_space,"(%s) %s\n",alias,userinput);
  1127.  
  1128.                                              Write(output_w,work_space,strlen(work_space));
  1129.                                              
  1130.                                              trans->trans_Command=TKCMD_CONDATA;
  1131.                                              strcpy(((UBYTE *)trans->trans_RequestData+4),work_space);
  1132.                                              *(ULONG *)trans->trans_RequestData=m_id;
  1133.                                              trans->trans_ReqDataActual=strlen(work_space)+5;
  1134.                                              trans->trans_Timeout=10;
  1135.                                              DoTransaction(dest,entity,trans);
  1136. // Process a transaction failure!!!                                             
  1137. // Not very critical
  1138.  
  1139.                                           }
  1140.                                        }
  1141.                                        packet->sp_Pkt.dp_Port=replyport;
  1142.                                        packet->sp_Pkt.dp_Type=ACTION_WAIT_CHAR;
  1143.                                        packet->sp_Pkt.dp_Arg1=34000;
  1144.                                        SendPkt(&packet->sp_Pkt,port,replyport);
  1145.                                     }
  1146.                                  }
  1147.                                  
  1148.                                  if(signal & (1<<sigbit))
  1149.                                  {
  1150.                                     if(a_trans=GetTransaction(a_entity))
  1151.                                     {
  1152.                                        if(a_trans->trans_Command == TKCMD_CONDATA)
  1153.                                        {
  1154.                                           Write(output_w,(UBYTE *)((UBYTE *)a_trans->trans_RequestData+4),a_trans->trans_ReqDataActual-4);
  1155.                                        }
  1156.                                        else if(a_trans->trans_Command == TKCMD_ABORT)
  1157.                                           done=1;
  1158.                                        ReplyTransaction(a_trans);
  1159.                                     }
  1160.                                  }
  1161.                               }
  1162.                               --pending;
  1163.                               while((ULONG *)GetMsg(replyport) != (ULONG *)&packet->sp_Msg);
  1164.                               DeleteMsgPort(replyport);
  1165.                            }
  1166.                            FreeMem(packet,(long)sizeof(struct StandardPacket));
  1167.                         }
  1168.                         Close(input_w);
  1169.                      }
  1170.                      Close(output_w);
  1171.                   }
  1172.                   if(done == 2)
  1173.                   {
  1174.                      trans->trans_ReqDataActual=4;
  1175.                      trans->trans_Command=TKCMD_CONEND;
  1176.                      *(ULONG *)trans->trans_RequestData=m_id;
  1177.                      trans->trans_Timeout=10;
  1178.                      DoTransaction(dest,entity,trans);
  1179.                   }
  1180.                }
  1181.                DeleteEntity(a_entity);
  1182.             }
  1183.             trans->trans_ReqDataLength = 516;
  1184.             FreeTransaction(trans);
  1185.          }
  1186.          LoseService(dest);
  1187.       }
  1188.       DeleteEntity(entity);
  1189.    }
  1190.    if(error)
  1191.    {
  1192.       GLB_Error=error;
  1193.       Signal(TKProc, TKSignalMask);
  1194.    }
  1195.    Forbid();
  1196.    if(Conf_Port=FindPort(Conf_Port_Name))
  1197.       PutMsg(Conf_Port,&Conf_Msg);
  1198.    Permit();
  1199. }
  1200.  
  1201.  
  1202.  
  1203. /*
  1204. ** Attempt to start a conference defined.  The conference name (conf_name),
  1205. ** conference host (conf_host), and alias (alias) are all defined globally
  1206. ** to make "passing" vars to a CreateNewProc() a little easier.
  1207. **
  1208. ** Error Results:
  1209. **
  1210. ** 0 - CreateNewProc() appears to have succeeded
  1211. ** 1 - CreateNewProc() appears to have failed
  1212. */
  1213.  
  1214. UBYTE StartTalk(ULONG start_command)
  1215. {
  1216.    ULONG cptags[5];
  1217.    UBYTE N_Name[64];
  1218.    struct Process *talkproc;
  1219.    UBYTE  sigbit;
  1220.    UBYTE error=1;
  1221.    
  1222.    geta4();
  1223.    ++Start_Count;
  1224.    BusyOn();
  1225.    if(sigbit = AllocSignal(-1L))
  1226.    {
  1227.       TKProc = FindTask(0L);
  1228.       TKSignalMask = (1L<<sigbit);
  1229.  
  1230. // Give each Conference a *UNIQUE* Process Name!
  1231. // didn't help any
  1232.  
  1233.       sprintf(N_Name,"%ld_%ld_%s",Start_Count,TKProc,conf_name);
  1234.  
  1235.       cptags[0] = NP_Entry;
  1236.       cptags[1] = (ULONG) TalkConf;
  1237.       cptags[2] = NP_Name;
  1238.       cptags[3] = (ULONG) N_Name;
  1239.       cptags[4] = TAG_DONE;
  1240.       
  1241.       TKCommand = start_command;
  1242.  
  1243.       if(talkproc = CreateNewProc((struct TagItem *)cptags))
  1244.       {
  1245.          Wait(1L<<sigbit);
  1246.          error=0;
  1247.       }
  1248.       FreeSignal(sigbit);
  1249.    }
  1250.  
  1251.    BusyOff();
  1252.    return(error);
  1253. }
  1254.  
  1255.  
  1256.  
  1257.  
  1258. /*
  1259. ** Get a list of active conferences for a given host (global var) when
  1260. ** passed a null.  Otherwise, it attempts to get a list of machines in
  1261. ** the conference named passed to it on the given host (global var).
  1262. **
  1263. ** BUG FIX!
  1264. ** Added an overall timeout incase the server disappears to prevent
  1265. ** waiting for a transaction that will NEVER happen.
  1266. ** 
  1267. ** Error Codes (in GLB_Error):
  1268. **
  1269. ** 1 - General failure
  1270. ** 2 - Unable to find service/host
  1271. */   
  1272.  
  1273.  
  1274. struct List *Get_Conference_List(UBYTE *c_name)
  1275. {
  1276.    ULONG sigbit=0,waitmask,signal,mem_p,sigbit2;
  1277.    struct c_worknode *c_mem;
  1278.    struct c_membnode *m_mem;
  1279.    UBYTE done;
  1280.    UBYTE host_name[32];
  1281.    struct Transaction *trans,*a_trans;
  1282.    void *entity,*a_entity,*dest;
  1283.    struct List *r_value=NULL;
  1284.    struct TagItem cetags[4];
  1285.    struct TagItem cbtags[2];
  1286.    struct TagItem ttags[3];
  1287.    struct MsgPort *TimerMP;
  1288.    struct timerequest *TimerIO;
  1289.    
  1290.  
  1291.    BusyOn();
  1292.    
  1293.    if(TimerMP=CreateMsgPort())
  1294.    {
  1295.       if(TimerIO=(struct timerequest *)CreateExtIO(TimerMP,sizeof(struct timerequest)))
  1296.       {
  1297.          if(!(OpenDevice(TIMERNAME,UNIT_VBLANK,(struct IORequest *)TimerIO,0)))
  1298.          {
  1299.             cetags[0].ti_Tag=ENT_Name;
  1300.             cetags[0].ti_Data=NULL;
  1301.             cetags[1].ti_Tag=ENT_Public;
  1302.             cetags[1].ti_Data=NULL;
  1303.             cetags[2].ti_Tag=ENT_AllocSignal;
  1304.             cetags[2].ti_Data=NULL;
  1305.             cetags[3].ti_Tag=TAG_END;
  1306.             cetags[3].ti_Data=NULL;
  1307.          
  1308.             cbtags[0].ti_Tag=ENT_AllocSignal;
  1309.             cbtags[0].ti_Data=NULL;
  1310.             cbtags[1].ti_Tag=TAG_END;
  1311.             cbtags[1].ti_Data=NULL;
  1312.             
  1313.             ttags[0].ti_Tag=TRN_AllocReqBuffer;
  1314.             ttags[0].ti_Data=516;
  1315.             ttags[1].ti_Tag=TRN_AllocRespBuffer;
  1316.             ttags[1].ti_Data=4;
  1317.             ttags[2].ti_Tag=TAG_END;
  1318.             ttags[2].ti_Data=NULL;
  1319.          
  1320.             GLB_Error=1;
  1321.             if(c_name)
  1322.                FreeMList();
  1323.             else
  1324.                FreeCList();
  1325.          
  1326.             cbtags[0].ti_Data=(ULONG) &sigbit2;
  1327.             cetags[2].ti_Data=(ULONG) &sigbit;
  1328.          
  1329.             if (entity = CreateEntityA((struct TagItem *) cbtags))
  1330.             {
  1331.                GLB_Error=2;
  1332.                if (dest = FindServiceA(conf_host, "Conf_Service", entity, NULL))
  1333.                {
  1334.                   GLB_Error=1;
  1335.                   if (trans = AllocTransactionA((struct TagItem *) ttags))
  1336.                   {
  1337.                      cetags[0].ti_Data=(ULONG) "Conference_List";
  1338.                      GLB_Error=1;
  1339.                      if(a_entity=CreateEntityA((struct TagItem *) cetags))
  1340.                      {
  1341.                         GLB_Error=0;
  1342.                         GetHostName(entity,host_name,31);
  1343.                         strcpy(((UBYTE *)trans->trans_RequestData+4),host_name);
  1344.                         trans->trans_ReqDataActual=strlen(host_name)+5;
  1345.                         if(!c_name)
  1346.                         {
  1347.                            trans->trans_Command=TKCMD_CONLIST;
  1348.                         }
  1349.                         else
  1350.                         {
  1351.                            strcpy(((UBYTE *)trans->trans_RequestData+4),c_name);
  1352.                            strcpy(((UBYTE *)trans->trans_RequestData+36),host_name);
  1353.                            trans->trans_ReqDataActual=strlen(host_name)+37;
  1354.                            trans->trans_Command=TKCMD_MALIST;
  1355.                         }
  1356.          
  1357.                         trans->trans_Timeout=10;
  1358.                         DoTransaction(dest,entity,trans);
  1359.          
  1360.                         if(!trans->trans_Error)
  1361.                         {
  1362.                            waitmask = (1<<sigbit) | (1L << TimerMP->mp_SigBit);
  1363.                            
  1364.                            TimerIO->tr_node.io_Command=TR_ADDREQUEST;
  1365.                            TimerIO->tr_time.tv_secs=20;
  1366.                            TimerIO->tr_time.tv_micro=0;
  1367.                            SendIO((struct IORequest *)TimerIO);
  1368.                
  1369.                            done=0;
  1370.                            
  1371.                            while(!done)
  1372.                            {
  1373.                               signal = Wait(waitmask);
  1374.                               if(signal & (1<<sigbit))
  1375.                               {
  1376.                                  if(a_trans=GetTransaction(a_entity))
  1377.                                  {
  1378.                                     if(a_trans->trans_Command == TKCMD_CLDATA)
  1379.                                     {
  1380.                                        for(mem_p=4;mem_p<a_trans->trans_ReqDataActual;mem_p+=32)
  1381.                                        {
  1382.                                           if(c_name)
  1383.                                           {
  1384.                                              if(m_mem=AllocMem(sizeof(struct c_membnode),NULL))
  1385.                                              {
  1386.                                                 m_mem->cnode.ln_Name=m_mem->alias;
  1387.                                                 strcpy(m_mem->name,(UBYTE *)a_trans->trans_RequestData+mem_p);
  1388.                                                 strcpy(m_mem->alias,(UBYTE *)a_trans->trans_RequestData+mem_p+32);
  1389.                                                 m_mem->flags=(ULONG) *((ULONG *)((UBYTE *)a_trans->trans_RequestData+mem_p+64));
  1390.                                                 AddTail(&c_memblist,(struct Node *)m_mem);
  1391.                                                 r_value=&c_memblist;
  1392.                                                 mem_p+=36;
  1393.                                              }
  1394.                                           }
  1395.                                           else
  1396.                                           {
  1397.                                              if(c_mem=AllocMem(sizeof(struct c_worknode),NULL))
  1398.                                              {
  1399.                                                 c_mem->cnode.ln_Name=c_mem->name;
  1400.                                                 strcpy(c_mem->name,(UBYTE *)a_trans->trans_RequestData+mem_p);
  1401.                                                 AddTail(&c_worklist,(struct Node *)c_mem);
  1402.                                                 r_value=&c_worklist;
  1403.                                              }
  1404.                                           }
  1405.                                        }
  1406.                                     }
  1407.                                     else if(a_trans->trans_Command == TKCMD_CLEND)
  1408.                                     {
  1409.                                        done=1;
  1410.                                     }
  1411.                                     a_trans->trans_Error=0;
  1412.                                     ReplyTransaction(a_trans);
  1413.                
  1414.                                     if(!(CheckIO((struct IORequest *)TimerIO)))
  1415.                                     {
  1416.                                        AbortIO((struct IORequest *)TimerIO);
  1417.                                     }
  1418.                                     WaitIO((struct IORequest *)TimerIO);
  1419.          
  1420.                                     TimerIO->tr_node.io_Command=TR_ADDREQUEST;
  1421.                                     TimerIO->tr_time.tv_secs=20;
  1422.                                     TimerIO->tr_time.tv_micro=0;
  1423.                                     SendIO((struct IORequest *)TimerIO);
  1424.                                  }                                    
  1425.                               }
  1426.                               if(signal & (1L << TimerMP->mp_SigBit))
  1427.                               {
  1428.                                  if(GetMsg(TimerMP))
  1429.                                  {
  1430.                                     done=1;
  1431.                                     GLB_Error=13;  /* Overall Timeout Error */       
  1432.                                  }
  1433.                               }
  1434.                            }
  1435.                         }
  1436.                         else
  1437.                         {
  1438.                            GLB_Error=trans->trans_Error;
  1439.                         }
  1440.                         
  1441.                         if(!(CheckIO((struct IORequest *)TimerIO)))
  1442.                         {
  1443.                            AbortIO((struct IORequest *)TimerIO);
  1444.                         }
  1445.                         WaitIO((struct IORequest *)TimerIO);
  1446.          
  1447.                         DeleteEntity(a_entity);  
  1448.                      }                           
  1449.                      FreeTransaction(trans);
  1450.                   }
  1451.                   LoseService(dest);
  1452.                }
  1453.                DeleteEntity(entity);
  1454.             }
  1455.             CloseDevice((struct IORequest *)TimerIO);
  1456.          }
  1457.          DeleteExtIO((struct IORequest *)TimerIO);
  1458.       }
  1459.       DeleteMsgPort(TimerMP);
  1460.    }
  1461.    BusyOff();
  1462.    return(r_value);
  1463. }
  1464.  
  1465.  
  1466.  
  1467. /*
  1468. **
  1469. ** Attempts to send a private message to a specific user.
  1470. **
  1471. */ 
  1472.  
  1473. void Send_PrivateMsg(void)
  1474. {
  1475.    ULONG sigbit2;
  1476.    struct Transaction *trans;
  1477.    void *entity,*dest;
  1478.    UBYTE host_name[32],work_space[512];
  1479.    struct TagItem cbtags[2];
  1480.    struct TagItem ttags[3];
  1481.  
  1482.  
  1483.    BusyOn();
  1484.  
  1485.    cbtags[0].ti_Tag=ENT_AllocSignal;
  1486.    cbtags[0].ti_Data=(ULONG) &sigbit2;
  1487.    cbtags[1].ti_Tag=TAG_END;
  1488.    cbtags[1].ti_Data=NULL;
  1489.    
  1490.    ttags[0].ti_Tag=TRN_AllocReqBuffer;
  1491.    ttags[0].ti_Data=516;
  1492.    ttags[1].ti_Tag=TRN_AllocRespBuffer;
  1493.    ttags[1].ti_Data=4;
  1494.    ttags[2].ti_Tag=TAG_END;
  1495.    ttags[2].ti_Data=NULL;
  1496.  
  1497.    GLB_Error=1;
  1498.    if(entity = CreateEntityA((struct TagItem *) cbtags))
  1499.    {
  1500.       GLB_Error=2;
  1501.       if (dest = FindServiceA(conf_host, "Conf_Service", entity, NULL))
  1502.       {
  1503.          GLB_Error=1;
  1504.          if (trans = AllocTransactionA((struct TagItem *) ttags))
  1505.          {
  1506.             GetHostName(entity,host_name,31);
  1507.             GLB_Error=0;
  1508.             if(alias[0])
  1509.                sprintf(work_space,"}%s{ %s\n",alias,pri_msg);
  1510.             else
  1511.                sprintf(work_space,"}%s{ %s\n",host_name,pri_msg);
  1512.             *(ULONG *)trans->trans_RequestData=0xffffffff;
  1513.             strcpy(((UBYTE *)trans->trans_RequestData+4),machine_name);
  1514.             strcpy(((UBYTE *)trans->trans_RequestData+36),conf_name);
  1515.             strcpy(((UBYTE *)trans->trans_RequestData+68),work_space);
  1516.             trans->trans_Command=TKCMD_PRIVATE;
  1517.             trans->trans_ReqDataActual=strlen(work_space)+68;
  1518.             trans->trans_Timeout=10;
  1519.             DoTransaction(dest,entity,trans);
  1520.  
  1521.             if(trans->trans_Error)
  1522.             {
  1523.                 GLB_Error=trans->trans_Error | 0x10000;
  1524.             } else
  1525.             {
  1526.                 strcpy(((UBYTE *)trans->trans_RequestData+4),host_name);
  1527.                 trans->trans_Timeout=10;
  1528.                 DoTransaction(dest,entity,trans);
  1529.             }
  1530.  
  1531.             FreeTransaction(trans);
  1532.          }
  1533.          LoseService(dest);
  1534.       }
  1535.       DeleteEntity(entity);
  1536.    }
  1537.    BusyOff();
  1538. }
  1539.  
  1540.  
  1541.  
  1542.  
  1543. /*
  1544. **
  1545. ** Attempts to change the TALKING & LISTENING status of a user
  1546. **
  1547. */ 
  1548.  
  1549. void Send_ToggleMode(void)
  1550. {
  1551.    ULONG sigbit2;
  1552.    struct Transaction *trans;
  1553.    UBYTE host_name[32];
  1554.    void *entity,*dest;
  1555.    struct TagItem cbtags[2];
  1556.    struct TagItem ttags[3];
  1557.  
  1558.  
  1559.    BusyOn();
  1560.  
  1561.    cbtags[0].ti_Tag=ENT_AllocSignal;
  1562.    cbtags[0].ti_Data=(ULONG) &sigbit2;
  1563.    cbtags[1].ti_Tag=TAG_END;
  1564.    cbtags[1].ti_Data=NULL;
  1565.    
  1566.    ttags[0].ti_Tag=TRN_AllocReqBuffer;
  1567.    ttags[0].ti_Data=516;
  1568.    ttags[1].ti_Tag=TRN_AllocRespBuffer;
  1569.    ttags[1].ti_Data=4;
  1570.    ttags[2].ti_Tag=TAG_END;
  1571.    ttags[2].ti_Data=NULL;
  1572.  
  1573.    GLB_Error=1;
  1574.    if(entity = CreateEntityA((struct TagItem *) cbtags))
  1575.    {
  1576.       GLB_Error=2;
  1577.       if (dest = FindServiceA(conf_host, "Conf_Service", entity, NULL))
  1578.       {
  1579.          GLB_Error=1;
  1580.          if (trans = AllocTransactionA((struct TagItem *) ttags))
  1581.          {
  1582.             GetHostName(entity,host_name,31);
  1583.             GLB_Error=0;
  1584.  
  1585.             *(ULONG *)trans->trans_RequestData=0xffffffff;
  1586.             strcpy(((UBYTE *)trans->trans_RequestData+4),machine_name);
  1587.             strcpy(((UBYTE *)trans->trans_RequestData+36),conf_name);
  1588.             strcpy(((UBYTE *)trans->trans_RequestData+68),host_name);
  1589.             *(LONG *)((UBYTE *)trans->trans_RequestData+100)=cycle_mode;
  1590.             
  1591.             trans->trans_Command=TKCMD_STATUS;
  1592.             trans->trans_ReqDataActual=105;
  1593.             trans->trans_Timeout=10;
  1594.             DoTransaction(dest,entity,trans);
  1595.             
  1596.             if(trans->trans_Error)
  1597.                GLB_Error=trans->trans_Error | 0x10000;
  1598.             FreeTransaction(trans);
  1599.          }
  1600.          LoseService(dest);
  1601.       }
  1602.       DeleteEntity(entity);
  1603.    }
  1604.    BusyOff();
  1605. }
  1606.  
  1607.  
  1608.  
  1609.  
  1610. /*
  1611. **
  1612. ** Since FindName() is case sensitive, I can't use it...
  1613. **
  1614. */
  1615.  
  1616. struct Node *CFindName(struct List *cc_list,UBYTE *string)
  1617. {
  1618.    struct Node *r_value=NULL,*ln;
  1619.    
  1620.    for(ln=cc_list->lh_Head;ln->ln_Succ;ln=ln->ln_Succ)
  1621.    {
  1622.       if(!Stricmp(ln->ln_Name,string))
  1623.       {
  1624.          r_value=ln;
  1625.          break;
  1626.       }
  1627.    }
  1628.    return(r_value);
  1629. }
  1630.